<?php

namespace App\Console\Commands;

use App\Models\User;
use App\Models\MoneyBookUser;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;

class SetDefaultBookCommand extends Command
{
    /**
     * 命令名称
     *
     * @var string
     */
    protected $signature = 'money:set-default-book';

    /**
     * 命令描述
     *
     * @var string
     */
    protected $description = '检查没有默认账本的用户，如果只有一个账本，则设置为默认账本';

    /**
     * 执行命令
     */
    public function handle()
    {
        $this->info('开始检查没有默认账本的用户...');
        
        // 获取没有默认账本的用户
        $usersWithoutDefaultBook = User::whereNull('default_book_id')
            ->orWhere('default_book_id', 0)
            ->get();
        
        $this->info('找到 ' . $usersWithoutDefaultBook->count() . ' 个没有默认账本的用户');
        
        $updatedCount = 0;
        $skippedCount = 0;
        
        foreach ($usersWithoutDefaultBook as $user) {
            try {
                // 获取用户的所有账本
                $userBooks = MoneyBookUser::where('user_id', $user->id)
                    ->with('book')
                    ->get();
                
                $this->info("用户 ID={$user->id}, 名称={$user->name} 有 {$userBooks->count()} 个账本");
                
                // 如果用户只有一个账本，设置为默认账本
                if ($userBooks->count() === 1) {
                    $bookId = $userBooks->first()->book_id;
                    $user->default_book_id = $bookId;
                    $user->save();
                    
                    $updatedCount++;
                    $this->info("已为用户 ID={$user->id} 设置默认账本: {$bookId}");
                } else {
                    $skippedCount++;
                    if ($userBooks->count() === 0) {
                        $this->warn("用户 ID={$user->id} 没有任何账本，跳过");
                    } else {
                        $this->warn("用户 ID={$user->id} 有多个账本，需要手动设置默认账本，跳过");
                    }
                }
            } catch (\Exception $e) {
                $skippedCount++;
                $this->error("处理用户 ID={$user->id} 时发生异常: {$e->getMessage()}");
                Log::error("设置默认账本异常", [
                    'user_id' => $user->id,
                    'error' => $e->getMessage(),
                    'trace' => $e->getTraceAsString()
                ]);
            }
        }
        
        $this->info("检查完成: 成功设置 {$updatedCount} 个用户的默认账本，跳过 {$skippedCount} 个用户");
        return 0;
    }
}